import { jwtDecode } from 'jwt-decode'

/**
 * 保存 token 到本地存储
 */
export function setToken(token) {
  localStorage.setItem('token', token)
}

/**
 * 获取 token
 */
export function getToken() {
  return localStorage.getItem('token')
}

/**
 * 移除 token
 */
export function removeToken() {
  localStorage.removeItem('token')
  localStorage.removeItem('userInfo')
}

/**
 * 解析 JWT token 获取用户信息
 */
export function parseToken(token) {
  try {
    const decoded = jwtDecode(token)
    return {
      id: decoded.id,
      roleType: decoded.roleType,
      exp: decoded.exp,
      iat: decoded.iat
    }
  } catch (error) {
    console.error('Token 解析失败:', error)
    return null
  }
}

/**
 * 获取当前用户信息
 */
export function getUserInfo() {
  const token = getToken()
  if (!token) return null
  
  // 先从缓存读取
  const cachedUserInfo = localStorage.getItem('userInfo')
  if (cachedUserInfo) {
    try {
      return JSON.parse(cachedUserInfo)
    } catch (e) {
      console.error('解析用户信息失败:', e)
      localStorage.removeItem('userInfo')
    }
  }
  
  // 解析 token 获取基本信息
  const userInfo = parseToken(token)
  if (userInfo) {
    localStorage.setItem('userInfo', JSON.stringify(userInfo))
  }
  return userInfo
}

/**
 * 保存用户完整信息
 */
export function setUserInfo(userInfo) {
  if (userInfo) {
    // 获取现有的 token 信息，保留 exp 和 iat
    const token = getToken()
    if (token) {
      const tokenInfo = parseToken(token)
      if (tokenInfo) {
        // 合并保留 exp 和 iat
        userInfo = {
          ...userInfo,
          exp: tokenInfo.exp,
          iat: tokenInfo.iat
        }
      }
    }
    localStorage.setItem('userInfo', JSON.stringify(userInfo))
  }
}

/**
 * 更新用户信息缓存
 */
export function updateUserInfo(updates) {
  const userInfo = getUserInfo()
  if (userInfo) {
    const newUserInfo = { ...userInfo, ...updates }
    setUserInfo(newUserInfo)
    return newUserInfo
  }
  return null
}

/**
 * 检查 token 是否过期
 */
export function isTokenExpired() {
  const token = getToken()
  if (!token) return true
  
  // 直接从 token 解析获取 exp，更可靠
  const tokenInfo = parseToken(token)
  if (!tokenInfo || !tokenInfo.exp) return true
  
  const currentTime = Math.floor(Date.now() / 1000)
  return currentTime > tokenInfo.exp
}

/**
 * 获取角色类型名称
 */
export function getRoleName(roleType) {
  const roleMap = {
    1: '普通员工',
    2: '部门经理',
    3: '系统管理员'
  }
  return roleMap[roleType] || '未知角色'
}
